4.10 元素填充及方向
1、元素填充
如果DataFrame表格有有缺失值,可以指定数据去填充,也可是用与缺失值相邻的数据去填充, df.fillna()函数正是具备这种填充能力的函数,结构如下:
Df.fillna(Value=None,method=None,aixs=None,inplace=False,limit=None,downcast=None)
value :填充缺失值的数据,可以是标量值、Series、字典或者DataFrame
mathod :使用相邻数据填充,backfill,bfill表示向上填充,pad、fill表示向下填充
axis : 缺失值填充方向(忽略)
inplace :就地修改
downcast :把item->dtype的字典将尝试向下转换为适当的相等类型字符串。
有如下填充方式:
1、用标填充(填充统一数据)
2、用Series填充,(不同列填充不同数据)
3、字典填充
4、用DataFrame填充:用一个全表填充另一个有空白的表,但位置须要一一对应。
import pandas as pd
df=pd.read_excel( "D:\Pyobject2023\object\测试\素材\测试素村.填充表格.xlsx" )
print (df)
# t1=df.fillna(0)#填充全部空白数据,标量填充
# s=pd.Series([ "无名氏","0","未通过"] ,["姓名","分数","状态"])
# df1=df.fillna(s) # 两组数据一一对应,等同以下字典写法
df1=df.fillna({
"姓名" : "无名氏" ,
"分数" : "0" ,
"状态" : "未通过"
})
print (df1)
返回:
姓名 | 分数 | 状态 | |
---|---|---|---|
0 | 张三 | 98.0 | 通过 |
1 | NaN | NaN | NaN |
2 | 李四 | NaN | NaN |
3 | NaN | 58.0 | 未过 |
4 | NaN | 58.0 | NaN |
5 | 王二 | NaN | NaN |
姓名 | 分数 | 状态 | |
---|---|---|---|
0 | 张三 | 98.0 | 通过 |
1 | 无名氏 | 0 | 未通过 |
2 | 李四 | 0 | 未通过 |
3 | 无名氏 | 58.0 | 未过 |
4 | 无名氏 | 58.0 | 未通过 |
5 | 王二 | 0 | 未通过 |
2、元素填充-填充方向
表格有缺失值,除了用指定数据却说填充,也可以使用缺失值上下相邻的非缺失值填充。
(1)向下填充
向下填充缺失值时,df.fillna()函数的method参数为pad或者ffill均可,也可以使用df.ffill()
(2)向上填充
向上填充时,df.fillna()函数的method参数为packfill或者bfill均可,也可以使用df.bfill()
import pandas as pd
df=pd.read_excel( "D:\Pyobject2023\object\测试\素材\测试素村.填充表格.xlsx" )
print (df)
# df1=df.fillna(method= "pad")
df1=df.ffill() #等同上一行
print (df1)
返回:
姓名 | 分数 | 状态 | |
---|---|---|---|
0 | 张三 | 98.0 | 通过 |
1 | NaN | NaN | NaN |
2 | 李四 | NaN | NaN |
3 | NaN | 58.0 | 未过 |
4 | NaN | 58.0 | NaN |
5 | 王二 | NaN | NaN |
姓名 | 分数 | 状态 | |
---|---|---|---|
0 | 张三 | 98.0 | 通过 |
1 | 张三 | 98.0 | 通过 |
2 | 李四 | 98.0 | 通过 |
3 | 李四 | 58.0 | 未过 |
4 | 李四 | 58.0 | 未过 |
5 | 王二 | 58.0 | 未过 |
3、Series字符填充
用0填充字符串是比较常见的一种方式,所以pandas专门提供了s.str.zfill()函数来解决这类问题, 它在字符串左侧填充0,结构如下
s.str.zfill(width)
width:指定填充后的统一字符长度。
比如将Series中的数字统一为四位,不足用0补齐
做字符串填充时,可以从不同位置填充,s.str.ljust()函数表示从左侧填充,s.str.rjust()
表示从右侧填充,s.str.center()表示从 两侧填充。
s.str.rfill(width,fillchar=””)
fillchar默认为空
s.str.pad (width,side=”left”,fillchar=””)
side :letf 左边 right 右边 both 两边
import pandas as pd
s=pd.Series([ "9527","666","99" ])
t1=s.str.zfill( 4 )
t2=s.str.rjust( 4 , "*" )
t3=s.str.pad( 6 , side = "both" , fillchar = "*" ) # fillchar=不能省略
print (t1)
print (t2)
print (t3)
返回:
0 | 9527 |
1 | 0666 |
2 | 0099 |
dtype: object
0 | 9527 |
1 | *666 |
2 | **99 |
dtype: object
0 | *9527* |
1 | *666** |
2 | **99** |
dtype: object